/*************************************************************************
    > File Name    : Configuration.h
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月28日 星期一 11时13分17秒
 ************************************************************************/

#ifndef __LL_CONFIGURATION_H__
#define __LL_CONFIGURATION_H__

// 辅助类智能指针 + 饿汉的单例模式

#include <string>
#include <unordered_set>
#include <unordered_map>
using std::string;
using std::unordered_set;
using std::unordered_map;

string getPath(const string filename);
// 这里返回引用确实是可以减少拷贝次数，但是可能会把返回值更改，是不安全的
// 声明为友元函数可以不写类的作用域
// 用于直接获取_configMap中的地址项

class Configuration
{
    friend string getPath(const string filename);

public:
    static Configuration *getInstance();
    void showConfig() const;
    unordered_map<string, string> &getConfigMap();
    unordered_set<string> getStopWorlList() const;

private:
    // 辅助类智能指针
    class AutoRelease
    {
    public:
        AutoRelease();
        ~AutoRelease();
    };

    Configuration(const string &filePath);
    // 单例模式删除值语义
    Configuration(const Configuration &rhs) = delete;
    Configuration &operator=(const Configuration &rhs) = delete;
    
    // 加载停用词
    void initStopWords();
    void insertStopWords(const string &filePath);

private:
    static Configuration                *_pInstance;
    static AutoRelease                  _autoRelease;

    string                              _filePath;
    unordered_map<string, string>       _configMap;
    unordered_set<string>               _stopWordList;
};

#endif
